package de.hda.particles.menu.factory;

import de.hda.particles.camera.*;
import de.hda.particles.domain.factory.*;
import de.hda.particles.domain.initializer.*;
import de.hda.particles.editor.*;
import de.hda.particles.emitter.*;
import de.hda.particles.features.*;
import de.hda.particles.hud.*;
import de.hda.particles.menu.HUDMenuEntry;
import de.hda.particles.menu.dynamic.SkyboxMenu;
import de.hda.particles.modifier.*;
import de.hda.particles.modifier.collision.CollisionPlane;
import de.hda.particles.modifier.color.*;
import de.hda.particles.modifier.gravity.*;
import de.hda.particles.modifier.size.LinearSizeTransformation;
import de.hda.particles.modifier.size.PulseSizeTransformation;
import de.hda.particles.modifier.velocity.MassSpringTransformation;
import de.hda.particles.modifier.velocity.VelocityDamper;
import de.hda.particles.modifier.velocity.VelocityTransformation;
import de.hda.particles.renderer.*;
import de.hda.particles.renderer.faces.*;
import de.hda.particles.renderer.particles.*;
import de.hda.particles.scene.Scene;

/**
 * This class generates the main menu structure.
 * 
 * @author aschaeffer
 *
 */
public class MainMenuFactory {

	public HUDMenuEntry createMenu(Scene s) {
		HUDMenuEntry root = HUDMenuEntry.createRoot("Particle System Main Menu");
		HUDMenuEntry scene = HUDMenuEntry.create(root, "Scene");
		HUDMenuEntry particleRenderer = HUDMenuEntry.create(scene, "Particle Renderers");
		HUDMenuEntry addPointSpriteParticleRenderer = HUDMenuEntry.create(particleRenderer, "Add Point Sprite Particle Renderer");
		HUDMenuEntry addPrimitiveParticleRenderer = HUDMenuEntry.create(particleRenderer, "Add Primtive Particle Renderer");
		HUDMenuEntry addComplexParticleRenderer = HUDMenuEntry.create(particleRenderer, "Add Complex Particle Renderer");
		HUDMenuEntry addMassSpringParticleRenderer = HUDMenuEntry.create(particleRenderer, "Add Mass Spring Particle Renderer");
		HUDMenuEntry addPositionPathParticleRenderer = HUDMenuEntry.create(particleRenderer, "Add Position Path Particle Renderer");
		HUDMenuEntry addTechnicalParticleRenderer = HUDMenuEntry.create(particleRenderer, "Add Technical Particle Renderer");
		HUDMenuEntry.create(addComplexParticleRenderer, "Colored Point", HUDCommandTypes.ADD_PARTICLE_RENDERER, ColoredPointParticleRenderer.class);
		HUDMenuEntry.create(addComplexParticleRenderer, "Complex Point (Color & Size)", HUDCommandTypes.ADD_PARTICLE_RENDERER, ComplexPointParticleRenderer.class);
		HUDMenuEntry.create(addComplexParticleRenderer, "Rain", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleRainParticleRenderer.class);
		HUDMenuEntry.create(addComplexParticleRenderer, "Cube (Color & Size)", HUDCommandTypes.ADD_PARTICLE_RENDERER, CubeParticleRenderer.class);
		HUDMenuEntry.create(addComplexParticleRenderer, "VeloCube (Color & Size & Velocity)", HUDCommandTypes.ADD_PARTICLE_RENDERER, VeloCubeParticleRenderer.class);
		HUDMenuEntry.create(addComplexParticleRenderer, "Metaballs", HUDCommandTypes.ADD_PARTICLE_RENDERER, MetaBallsParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Point", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimplePointParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Line Strip", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleLineStripParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Triangle", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleTriangleParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Triangle Strip", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleTriangleStripParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Triangle Fan", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleTriangleFanParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Quads", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleQuadsParticleRenderer.class);
		HUDMenuEntry.create(addPrimitiveParticleRenderer, "Simple Sphere", HUDCommandTypes.ADD_PARTICLE_RENDERER, SimpleSphereParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Ball", HUDCommandTypes.ADD_PARTICLE_RENDERER, BallParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Smoke", HUDCommandTypes.ADD_PARTICLE_RENDERER, SmokeParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Electric", HUDCommandTypes.ADD_PARTICLE_RENDERER, ElectricParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Explosion", HUDCommandTypes.ADD_PARTICLE_RENDERER, ExplosionParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "FireBall", HUDCommandTypes.ADD_PARTICLE_RENDERER, FireBallParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Flames", HUDCommandTypes.ADD_PARTICLE_RENDERER, FlamesParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Poison", HUDCommandTypes.ADD_PARTICLE_RENDERER, PoisonParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Ring", HUDCommandTypes.ADD_PARTICLE_RENDERER, RingParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "SFlare", HUDCommandTypes.ADD_PARTICLE_RENDERER, SFlareParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Snow", HUDCommandTypes.ADD_PARTICLE_RENDERER, SnowParticleRenderer.class);
		HUDMenuEntry.create(addPointSpriteParticleRenderer, "Star", HUDCommandTypes.ADD_PARTICLE_RENDERER, StarParticleRenderer.class);
		HUDMenuEntry.create(addPositionPathParticleRenderer, "Tube", HUDCommandTypes.ADD_PARTICLE_RENDERER, TubeParticleRenderer.class);
		HUDMenuEntry.create(addPositionPathParticleRenderer, "Spiral", HUDCommandTypes.ADD_PARTICLE_RENDERER, SpiralParticleRenderer.class);
		HUDMenuEntry.create(addPositionPathParticleRenderer, "Hair", HUDCommandTypes.ADD_PARTICLE_RENDERER, HairParticleRenderer.class);
		HUDMenuEntry.create(addMassSpringParticleRenderer, "Spring Polygons", HUDCommandTypes.ADD_PARTICLE_RENDERER, SpringPolygonsParticleRenderer.class);
		HUDMenuEntry.create(addMassSpringParticleRenderer, "Springs Lines", HUDCommandTypes.ADD_PARTICLE_RENDERER, SpringLinesParticleRenderer.class);
		HUDMenuEntry.create(addTechnicalParticleRenderer, "NULL", HUDCommandTypes.ADD_PARTICLE_RENDERER, NullParticleRenderer.class);
		HUDMenuEntry.create(addTechnicalParticleRenderer, "Velocity Indicator", HUDCommandTypes.ADD_PARTICLE_RENDERER, VelocityIndicatorParticleRenderer.class);
		HUDMenuEntry.create(addTechnicalParticleRenderer, "Vertex Array Point", HUDCommandTypes.ADD_PARTICLE_RENDERER, VAPointParticleRenderer.class);
		HUDMenuEntry faceRenderers = HUDMenuEntry.create(scene, "Face Renderers");
		HUDMenuEntry.create(faceRenderers, "Polygon", HUDCommandTypes.ADD_FACE_RENDERER, PolygonFaceRenderer.class);
		HUDMenuEntry.create(faceRenderers, "NULL", HUDCommandTypes.ADD_FACE_RENDERER, NullFaceRenderer.class);
		HUDMenuEntry renderer = HUDMenuEntry.create(scene, "Renderer");
		HUDMenuEntry rendererOptions = HUDMenuEntry.create(renderer, "Renderer Options");
		HUDMenuEntry rendererOptionsBBPCR = HUDMenuEntry.create(rendererOptions, "Bounding Box Particle Culling Renderer");
		HUDMenuEntry.create(rendererOptionsBBPCR, "Show Particle Culling Box", HUDCommandTypes.SHOW_RENDERER, BoundingBoxParticleCullingRenderer.class);
		HUDMenuEntry.create(rendererOptionsBBPCR, "Hide Particle Culling Box", HUDCommandTypes.HIDE_RENDERER, BoundingBoxParticleCullingRenderer.class);
		HUDMenuEntry rendererOptionsEmitter = HUDMenuEntry.create(rendererOptions, "Emitter Renderer");
		HUDMenuEntry.create(rendererOptionsEmitter, "Show Emitters", HUDCommandTypes.SHOW_RENDERER, EmitterRenderer.class);
		HUDMenuEntry.create(rendererOptionsEmitter, "Hide Emitters", HUDCommandTypes.HIDE_RENDERER, EmitterRenderer.class);
		HUDMenuEntry rendererOptionsGravityPoint = HUDMenuEntry.create(rendererOptions, "Gravity Point Renderer");
		HUDMenuEntry.create(rendererOptionsGravityPoint, "Show Gravity Points", HUDCommandTypes.SHOW_RENDERER, GravityPointRenderer.class);
		HUDMenuEntry.create(rendererOptionsGravityPoint, "Hide Gravity Points", HUDCommandTypes.HIDE_RENDERER, GravityPointRenderer.class);
		HUDMenuEntry rendererOptionsGravityPulsar = HUDMenuEntry.create(rendererOptions, "Gravity Pulsar Renderer");
		HUDMenuEntry.create(rendererOptionsGravityPulsar, "Show Gravity Pulsars", HUDCommandTypes.SHOW_RENDERER, GravityPulsarRenderer.class);
		HUDMenuEntry.create(rendererOptionsGravityPulsar, "Hide Gravity Pulsars", HUDCommandTypes.HIDE_RENDERER, GravityPulsarRenderer.class);
		HUDMenuEntry rendererOptionsGravityPlane = HUDMenuEntry.create(rendererOptions, "Gravity Plane Renderer");
		HUDMenuEntry.create(rendererOptionsGravityPlane, "Show Gravity Planes", HUDCommandTypes.SHOW_RENDERER, GravityPlaneRenderer.class);
		HUDMenuEntry.create(rendererOptionsGravityPlane, "Hide Gravity Planes", HUDCommandTypes.HIDE_RENDERER, GravityPlaneRenderer.class);
		HUDMenuEntry rendererOptionsBlackHole = HUDMenuEntry.create(rendererOptions, "Black Hole Renderer");
		HUDMenuEntry.create(rendererOptionsBlackHole, "Show Black Holes", HUDCommandTypes.SHOW_RENDERER, BlackHoleRenderer.class);
		HUDMenuEntry.create(rendererOptionsBlackHole, "Hide Black Holes", HUDCommandTypes.HIDE_RENDERER, BlackHoleRenderer.class);
		HUDMenuEntry rendererOptionsCollisionPlane = HUDMenuEntry.create(rendererOptions, "Collision Plane Renderer");
		HUDMenuEntry.create(rendererOptionsCollisionPlane, "Show Collision Planes", HUDCommandTypes.SHOW_RENDERER, CollisionPlaneRenderer.class);
		HUDMenuEntry.create(rendererOptionsCollisionPlane, "Hide Collision Planes", HUDCommandTypes.HIDE_RENDERER, CollisionPlaneRenderer.class);
		HUDMenuEntry rendererOptionsFixedPoint = HUDMenuEntry.create(rendererOptions, "Fixed Points Renderer");
		HUDMenuEntry.create(rendererOptionsFixedPoint, "Show Fixed Points", HUDCommandTypes.SHOW_RENDERER, FixedPointRenderer.class);
		HUDMenuEntry.create(rendererOptionsFixedPoint, "Hide Fixed Points", HUDCommandTypes.HIDE_RENDERER, FixedPointRenderer.class);
		HUDMenuEntry rendererOptionsSpring = HUDMenuEntry.create(rendererOptions, "Spring Renderer");
		HUDMenuEntry.create(rendererOptionsSpring, "Show Springs", HUDCommandTypes.SHOW_RENDERER, SpringRenderer.class);
		HUDMenuEntry.create(rendererOptionsSpring, "Hide Springs", HUDCommandTypes.HIDE_RENDERER, SpringRenderer.class);
		HUDMenuEntry rendererOptionsFixedPointSpring = HUDMenuEntry.create(rendererOptions, "Fixed Point Spring Renderer");
		HUDMenuEntry.create(rendererOptionsFixedPointSpring, "Show Fixed Point Springs", HUDCommandTypes.SHOW_RENDERER, FixedPointSpringRenderer.class);
		HUDMenuEntry.create(rendererOptionsFixedPointSpring, "Hide Fixed Point Springs", HUDCommandTypes.HIDE_RENDERER, FixedPointSpringRenderer.class);
		HUDMenuEntry rendererOptionsAxis = HUDMenuEntry.create(rendererOptions, "Axis Renderer");
		HUDMenuEntry.create(rendererOptionsAxis, "Show Axis", HUDCommandTypes.SHOW_RENDERER, AxisRenderer.class);
		HUDMenuEntry.create(rendererOptionsAxis, "Hide Axis", HUDCommandTypes.HIDE_RENDERER, AxisRenderer.class);
		HUDMenuEntry rendererOptionsCamera = HUDMenuEntry.create(rendererOptions, "Camera Renderer");
		HUDMenuEntry.create(rendererOptionsCamera, "Show Cameras", HUDCommandTypes.SHOW_RENDERER, CameraRenderer.class);
		HUDMenuEntry.create(rendererOptionsCamera, "Hide Cameras", HUDCommandTypes.HIDE_RENDERER, CameraRenderer.class);
		HUDMenuEntry rendererOptionsSkyBox = HUDMenuEntry.create(rendererOptions, "SkyBox Renderer");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Forge Skybox", HUDCommandTypes.SELECT_SKYBOX, "forge");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Gloom Skybox", HUDCommandTypes.SELECT_SKYBOX, "gloom");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Harmony Skybox", HUDCommandTypes.SELECT_SKYBOX, "harmony");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Interstellar Skybox", HUDCommandTypes.SELECT_SKYBOX, "interstellar");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Ocean Skybox", HUDCommandTypes.SELECT_SKYBOX, "ocean");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Paze Skybox", HUDCommandTypes.SELECT_SKYBOX, "paze");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Raspberry Skybox", HUDCommandTypes.SELECT_SKYBOX, "raspberry");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Sleepy Hollow Skybox", HUDCommandTypes.SELECT_SKYBOX, "sleepyhollow");
		HUDMenuEntry.create(rendererOptionsSkyBox, "Show SkyBox", HUDCommandTypes.SHOW_RENDERER, SkyBoxRenderer.class);
		HUDMenuEntry.create(rendererOptionsSkyBox, "Hide SkyBox", HUDCommandTypes.HIDE_RENDERER, SkyBoxRenderer.class);
		HUDMenuEntry addRenderer = HUDMenuEntry.create(renderer, "Add Renderer");
		HUDMenuEntry.create(addRenderer, "Bounding Box Particle Culling Renderer", HUDCommandTypes.ADD_RENDERER, BoundingBoxParticleCullingRenderer.class);
		HUDMenuEntry.create(addRenderer, "Emitter Renderer", HUDCommandTypes.ADD_RENDERER, EmitterRenderer.class);
		HUDMenuEntry.create(addRenderer, "Gravity Point Renderer", HUDCommandTypes.ADD_RENDERER, GravityPointRenderer.class);
		HUDMenuEntry.create(addRenderer, "Gravity Pulsar Renderer", HUDCommandTypes.ADD_RENDERER, GravityPulsarRenderer.class);
		HUDMenuEntry.create(addRenderer, "Gravity Plane Renderer", HUDCommandTypes.ADD_RENDERER, GravityPlaneRenderer.class);
		HUDMenuEntry.create(addRenderer, "Black Hole Renderer", HUDCommandTypes.ADD_RENDERER, BlackHoleRenderer.class);
		HUDMenuEntry.create(addRenderer, "Collision Plane Renderer", HUDCommandTypes.ADD_RENDERER, CollisionPlaneRenderer.class);
		HUDMenuEntry.create(addRenderer, "Fixed Point Renderer", HUDCommandTypes.ADD_RENDERER, FixedPointRenderer.class);
		HUDMenuEntry.create(addRenderer, "Spring Renderer", HUDCommandTypes.ADD_RENDERER, SpringRenderer.class);
		HUDMenuEntry.create(addRenderer, "Fixed Point Spring Renderer", HUDCommandTypes.ADD_RENDERER, FixedPointSpringRenderer.class);
		HUDMenuEntry.create(addRenderer, "Axis Renderer", HUDCommandTypes.ADD_RENDERER, AxisRenderer.class);
		HUDMenuEntry.create(addRenderer, "Camera Renderer", HUDCommandTypes.ADD_RENDERER, CameraRenderer.class);
		HUDMenuEntry.create(addRenderer, "SkyBox Renderer", HUDCommandTypes.ADD_RENDERER, SkyBoxRenderer.class);
		HUDMenuEntry.create(renderer, "Show Text Overlay", HUDCommandTypes.SHOW_TEXT_OVERLAY);
		HUDMenuEntry.create(renderer, "Hide Text Overlay", HUDCommandTypes.HIDE_TEXT_OVERLAY);
		HUDMenuEntry.create(scene, "Display", HUDCommandTypes.EDIT, DisplayEditor.class);
		HUDMenuEntry.create(scene, "Select Skybox", HUDCommandTypes.OPEN_MENU_HUD, DynamicSelectionMenuHUD.class, SkyboxMenu.class);
		HUDMenuEntry huds = HUDMenuEntry.create(scene, "HUDs");
		HUDMenuEntry addHUD = HUDMenuEntry.create(huds, "Add HUD");
		HUDMenuEntry.create(addHUD, "CameraHUD", HUDCommandTypes.ADD_HUD, CameraHUD.class);
		HUDMenuEntry.create(addHUD, "CaptureHUD", HUDCommandTypes.ADD_HUD, CaptureHUD.class);
		HUDMenuEntry.create(addHUD, "CrosshairHUD", HUDCommandTypes.ADD_HUD, CrosshairHUD.class);
		HUDMenuEntry.create(addHUD, "EditorHUD", HUDCommandTypes.ADD_HUD, EditorHUD.class);
		HUDMenuEntry.create(addHUD, "EmitterHUD", HUDCommandTypes.ADD_HUD, EmitterHUD.class);
		HUDMenuEntry.create(addHUD, "FeatureHUD", HUDCommandTypes.ADD_HUD, FeatureHUD.class);
		HUDMenuEntry.create(addHUD, "FpsHUD", HUDCommandTypes.ADD_HUD, FpsHUD.class);
		HUDMenuEntry.create(addHUD, "HelpHUD", HUDCommandTypes.ADD_HUD, HelpHUD.class);
		HUDMenuEntry.create(addHUD, "MessageHUD", HUDCommandTypes.ADD_HUD, MessageHUD.class);
		HUDMenuEntry.create(addHUD, "ModifierHUD", HUDCommandTypes.ADD_HUD, ModifierHUD.class);
		HUDMenuEntry.create(addHUD, "ParticleSystemControlHUD", HUDCommandTypes.ADD_HUD, ParticleSystemControlHUD.class);
		HUDMenuEntry.create(addHUD, "RendererHUD", HUDCommandTypes.ADD_HUD, RendererHUD.class);
		HUDMenuEntry.create(addHUD, "ParticleRendererHUD", HUDCommandTypes.ADD_HUD, ParticleRendererHUD.class);
		HUDMenuEntry.create(addHUD, "TextOverlayHUD", HUDCommandTypes.ADD_HUD, TextOverlayHUD.class);
		HUDMenuEntry removeHUD = HUDMenuEntry.create(huds, "Remove HUD");
		HUDMenuEntry.create(removeHUD, "CameraHUD", HUDCommandTypes.REMOVE_HUD, CameraHUD.class);
		HUDMenuEntry.create(removeHUD, "CaptureHUD", HUDCommandTypes.REMOVE_HUD, CaptureHUD.class);
		HUDMenuEntry.create(removeHUD, "CrosshairHUD", HUDCommandTypes.REMOVE_HUD, CrosshairHUD.class);
		HUDMenuEntry.create(removeHUD, "EditorHUD", HUDCommandTypes.REMOVE_HUD, EditorHUD.class);
		HUDMenuEntry.create(removeHUD, "EmitterHUD", HUDCommandTypes.REMOVE_HUD, EmitterHUD.class);
		HUDMenuEntry.create(removeHUD, "FeatureHUD", HUDCommandTypes.REMOVE_HUD, FeatureHUD.class);
		HUDMenuEntry.create(removeHUD, "FpsHUD", HUDCommandTypes.REMOVE_HUD, FpsHUD.class);
		HUDMenuEntry.create(removeHUD, "HelpHUD", HUDCommandTypes.REMOVE_HUD, HelpHUD.class);
		HUDMenuEntry.create(removeHUD, "MessageHUD", HUDCommandTypes.REMOVE_HUD, MessageHUD.class);
		HUDMenuEntry.create(removeHUD, "ModifierHUD", HUDCommandTypes.REMOVE_HUD, ModifierHUD.class);
		HUDMenuEntry.create(removeHUD, "ParticleSystemControlHUD", HUDCommandTypes.REMOVE_HUD, ParticleSystemControlHUD.class);
		HUDMenuEntry.create(removeHUD, "RendererHUD", HUDCommandTypes.REMOVE_HUD, RendererHUD.class);
		HUDMenuEntry.create(removeHUD, "ParticleRendererHUD", HUDCommandTypes.REMOVE_HUD, ParticleRendererHUD.class);
		HUDMenuEntry.create(removeHUD, "TextOverlayHUD", HUDCommandTypes.REMOVE_HUD, TextOverlayHUD.class);
		HUDMenuEntry camera = HUDMenuEntry.create(scene, "Cameras");
		HUDMenuEntry.create(camera, "Add First Person Camera", HUDCommandTypes.ADD_CAMERA, FirstPersonCamera.class);
		HUDMenuEntry.create(camera, "Add Particle POV Camera", HUDCommandTypes.ADD_CAMERA, ParticlePOVCamera.class);
		HUDMenuEntry.create(camera, "Add Particle Origin Camera", HUDCommandTypes.ADD_CAMERA, ParticleOriginCamera.class);
		HUDMenuEntry.create(camera, "Add Top Down Camera", HUDCommandTypes.ADD_CAMERA, TopDownCamera.class);
		HUDMenuEntry.create(camera, "Add Third Person Spectator Camera", HUDCommandTypes.ADD_CAMERA, ThirdPersonSpectatorCamera.class);
		HUDMenuEntry.create(camera, "Remove Current Camera", HUDCommandTypes.REMOVE_CAMERA);
		HUDMenuEntry.create(scene, "System Info", HUDCommandTypes.EDIT, SystemInfoEditor.class);
		HUDMenuEntry.create(scene, "Load Scene", HUDCommandTypes.LOAD_SCENE);
		HUDMenuEntry.create(scene, "Save Scene", HUDCommandTypes.SAVE_SCENE);
		HUDMenuEntry.create(scene, "Remove all Particles", HUDCommandTypes.REMOVE_ALL_PARTICLES);
		HUDMenuEntry physics = HUDMenuEntry.create(root, "Physics");
		HUDMenuEntry emitters = HUDMenuEntry.create(physics, "Emitters");
		HUDMenuEntry addEmitters = HUDMenuEntry.create(emitters, "Add Emitter");
		HUDMenuEntry.create(addEmitters, "Point", HUDCommandTypes.ADD_EMITTER, PooledPointParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addEmitters, "Plane", HUDCommandTypes.ADD_EMITTER, PlaneParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addEmitters, "Sphere / Ring", HUDCommandTypes.ADD_EMITTER, PooledSphereParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addEmitters, "Cloth (MassSpring)", HUDCommandTypes.ADD_EMITTER, PooledClothParticleEmitter.class, ParticleEmitterConfigurationFactory.class, PooledClothParticleEmitterInitializer.class);
		HUDMenuEntry.create(addEmitters, "3D Field", HUDCommandTypes.ADD_EMITTER, PooledFieldParticleEmitter.class, ParticleEmitterConfigurationFactory.class, PooledFieldParticleEmitterInitializer.class);
		HUDMenuEntry addOtherEmitters = HUDMenuEntry.create(addEmitters, "Experimental / Deprecated");
		HUDMenuEntry.create(addOtherEmitters, "Tetrahedron", HUDCommandTypes.ADD_EMITTER, PooledTetrahedronParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addOtherEmitters, "Soft Body", HUDCommandTypes.ADD_EMITTER, PooledSoftBodyEmitter.class, ParticleEmitterConfigurationFactory.class, PooledSoftBodyEmitterInitializer.class);
		HUDMenuEntry.create(addOtherEmitters, "Wave", HUDCommandTypes.ADD_EMITTER, PooledWaveParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addOtherEmitters, "2D Grid", HUDCommandTypes.ADD_EMITTER, PooledGridParticleEmitter.class, ParticleEmitterConfigurationFactory.class, PooledGridParticleEmitterInitializer.class);
		HUDMenuEntry.create(addOtherEmitters, "Point (Pulse Rate)", HUDCommandTypes.ADD_EMITTER, PooledPulseRatePointParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addOtherEmitters, "Point (Static)", HUDCommandTypes.ADD_EMITTER, StaticPointParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry.create(addOtherEmitters, "Point (Slow)", HUDCommandTypes.ADD_EMITTER, PointParticleEmitter.class, ParticleEmitterConfigurationFactory.class);
		HUDMenuEntry modifiers = HUDMenuEntry.create(physics, "Modifiers");
		HUDMenuEntry addModifiers = HUDMenuEntry.create(modifiers, "Add Modifier");
		HUDMenuEntry addModifiersGravity = HUDMenuEntry.create(addModifiers, "Gravity");
		HUDMenuEntry addModifiersVelocity = HUDMenuEntry.create(addModifiers, "Velocity");
		HUDMenuEntry addModifiersCollision = HUDMenuEntry.create(addModifiers, "Collision");
		HUDMenuEntry addModifiersColors = HUDMenuEntry.create(addModifiers, "Colors");
		HUDMenuEntry addModifiersSize = HUDMenuEntry.create(addModifiers, "Size");
		HUDMenuEntry addModifiersOther = HUDMenuEntry.create(addModifiers, "Other Modifiers");
		HUDMenuEntry.create(addModifiersGravity, "Gravity Point", HUDCommandTypes.ADD_MODIFIER, GravityPoint.class, GravityPointConfigurationFactory.class);
		HUDMenuEntry.create(addModifiersGravity, "Gravity Pulsar", HUDCommandTypes.ADD_MODIFIER, GravityPulsar.class, GravityPulsarConfigurationFactory.class);
		HUDMenuEntry.create(addModifiersGravity, "Gravity Plane", HUDCommandTypes.ADD_MODIFIER, GravityPlane.class, GravityPlaneConfigurationFactory.class);
		HUDMenuEntry.create(addModifiersGravity, "Black Hole", HUDCommandTypes.ADD_MODIFIER, BlackHole.class, BlackHoleConfigurationFactory.class);
		HUDMenuEntry.create(addModifiersVelocity, "Velocity Transformation", HUDCommandTypes.ADD_MODIFIER, VelocityTransformation.class);
		HUDMenuEntry.create(addModifiersVelocity, "Velocity Damper", HUDCommandTypes.ADD_MODIFIER, VelocityDamper.class);
		HUDMenuEntry.create(addModifiersVelocity, "Mass Spring Transformation", HUDCommandTypes.ADD_MODIFIER, MassSpringTransformation.class);
		HUDMenuEntry.create(addModifiersVelocity, "Particle Gravity Transformation", HUDCommandTypes.ADD_MODIFIER, ParticleGravityTransformation.class);
		HUDMenuEntry.create(addModifiersCollision, "Collision Plane", HUDCommandTypes.ADD_MODIFIER, CollisionPlane.class, CollisionPlaneConfigurationFactory.class);
		HUDMenuEntry.create(addModifiersColors, "Random Start Color", HUDCommandTypes.ADD_MODIFIER, RandomStartColor.class);
		HUDMenuEntry.create(addModifiersColors, "Linear Color Transformation", HUDCommandTypes.ADD_MODIFIER, LinearColorTransformation.class);
		HUDMenuEntry.create(addModifiersColors, "Rainbow Color Transformation", HUDCommandTypes.ADD_MODIFIER, RainbowColorTransformation.class);
		HUDMenuEntry.create(addModifiersColors, "Random Color Transformation", HUDCommandTypes.ADD_MODIFIER, RandomColorTransformation.class);
		HUDMenuEntry.create(addModifiersColors, "Color Cycle Transformation", HUDCommandTypes.ADD_MODIFIER, ColorCycleTransformation.class);
		HUDMenuEntry.create(addModifiersSize, "Linear Size Transformation", HUDCommandTypes.ADD_MODIFIER, LinearSizeTransformation.class);
		HUDMenuEntry.create(addModifiersSize, "Pulse Size Transformation", HUDCommandTypes.ADD_MODIFIER, PulseSizeTransformation.class);
		HUDMenuEntry.create(addModifiersOther, "Particle Limiter", HUDCommandTypes.ADD_MODIFIER, ParticleLimiter.class);
		HUDMenuEntry.create(addModifiersOther, "Bounding Box Particle Culling", HUDCommandTypes.ADD_MODIFIER, BoundingBoxParticleCulling.class);
		HUDMenuEntry.create(addModifiersOther, "Position Path Buffering", HUDCommandTypes.ADD_MODIFIER, PositionPathBuffering.class);
		HUDMenuEntry.create(addModifiersOther, "Particle Debugger", HUDCommandTypes.ADD_MODIFIER, ParticleDebugger.class);
		HUDMenuEntry features = HUDMenuEntry.create(physics, "Particle Features");
		HUDMenuEntry addFeatures = HUDMenuEntry.create(features, "Add Feature");
		HUDMenuEntry.create(addFeatures, "Color", HUDCommandTypes.ADD_FEATURE, ParticleColor.class);
		HUDMenuEntry.create(addFeatures, "Size", HUDCommandTypes.ADD_FEATURE, ParticleSize.class);
		HUDMenuEntry.create(addFeatures, "Initial Velocity Scatter", HUDCommandTypes.ADD_FEATURE, ParticleInitialVelocityScatter.class);
		HUDMenuEntry.create(addFeatures, "Initial Mass Scatter", HUDCommandTypes.ADD_FEATURE, InitialMassScatter.class);
		HUDMenuEntry.create(addFeatures, "Mass-Spring", HUDCommandTypes.ADD_FEATURE, MassSpring.class);
		HUDMenuEntry.create(addFeatures, "Position Path Buffer", HUDCommandTypes.ADD_FEATURE, PositionPath.class);
		HUDMenuEntry.create(addFeatures, "Tube Segments", HUDCommandTypes.ADD_FEATURE, TubeSegments.class);
		HUDMenuEntry.create(addFeatures, "Replication", HUDCommandTypes.ADD_FEATURE, Replication.class);
		HUDMenuEntry removeFeatures = HUDMenuEntry.create(features, "Remove Feature");
		HUDMenuEntry.create(removeFeatures, "Color", HUDCommandTypes.REMOVE_FEATURE, ParticleColor.class);
		HUDMenuEntry.create(removeFeatures, "Size", HUDCommandTypes.REMOVE_FEATURE, ParticleSize.class);
		HUDMenuEntry.create(removeFeatures, "Initial Velocity Scatter", HUDCommandTypes.REMOVE_FEATURE, ParticleInitialVelocityScatter.class);
		HUDMenuEntry.create(removeFeatures, "Initial Mass Scatter", HUDCommandTypes.REMOVE_FEATURE, InitialMassScatter.class);
		HUDMenuEntry.create(removeFeatures, "Mass-Spring", HUDCommandTypes.REMOVE_FEATURE, MassSpring.class);
		HUDMenuEntry.create(removeFeatures, "Position Path Buffer", HUDCommandTypes.REMOVE_FEATURE, PositionPath.class);
		HUDMenuEntry.create(removeFeatures, "Tube Segments", HUDCommandTypes.REMOVE_FEATURE, TubeSegments.class);
		HUDMenuEntry.create(removeFeatures, "Replication", HUDCommandTypes.REMOVE_FEATURE, Replication.class);
		HUDMenuEntry.create(physics, "Load System", HUDCommandTypes.LOAD_SYSTEM);
		HUDMenuEntry.create(physics, "Save System", HUDCommandTypes.SAVE_SYSTEM);
		HUDMenuEntry.create(root, "Help", HUDCommandTypes.HELP);
		HUDMenuEntry.create(root, "Exit", HUDCommandTypes.EXIT);
		return root;
	}
}
